package main

import (
	"fmt"
	"reflect"
)

type myInt int
type Person struct {
	Name string
	Age  int
}

// 反射获取任意变量的类型
// reflect.TypeOf, reflect.ValueOf
// 类型名，类型种类（底层类型）

func reflectFn(x interface{}) {
	t := reflect.TypeOf(x)
	fmt.Printf("类型:%v, 类型名称:%v, 类型种类:%v\n", t, t.Name(), t.Kind())
	v := reflect.ValueOf(x)
	fmt.Printf("值:%v, 原始值:%v, 值种类:%v\n", v, v.Int(), v.Kind())
	fmt.Println(v.Int() + 10)
}

func reflectValue(x interface{}) {
	v := reflect.ValueOf(x)
	kind := v.Kind()

	switch kind {
	case reflect.Int:
		fmt.Printf("Int类型的原始值为%v\n", v.Int()+10)
	case reflect.Slice:
		fmt.Printf("Slice的原始值为%v\n", v.Slice(0, 3))
	case reflect.String:
		fmt.Printf("String类型的原始值为%v\n", v.String())
	default:
		fmt.Println("未知类型")
	}
}

func reflectSetValue(x interface{}) {

	// v := reflect.ValueOf(x)
	// if v.Kind() == reflect.Int {
	// 	v.SetInt(120)
	// }

	// v, _ := x.(*int)
	// *v = 123

	v := reflect.ValueOf(x)
	if v.Elem().Kind() == reflect.Int {
		v.Elem().SetInt(123)
	}
	if v.Elem().Kind() == reflect.String {
		v.Elem().SetString("123")
	}
}

func main() {
	a := 10
	// b := 23.4
	// c := true
	d := "你好golang"
	// var e myInt = 34
	// var f = Person{
	// 	Name: "张三",
	// 	Age:  20,
	// }
	// var g = [3]string{"1", "2", "3"}
	// var h = []int{1, 2, 3}
	// reflectFn(a)
	// reflectValue(b)
	// reflectValue(c)
	// reflectValue(d)
	// reflectValue(e)
	// reflectValue(f)
	// reflectValue(&f)
	// reflectValue(g)
	// reflectValue(h)
	reflectSetValue(&a)
	reflectSetValue(&d)
	fmt.Println(a)
	fmt.Println(d)
}
